package ausgabeUndDatenverwaltung;

import java.util.*;

import einlesenUndDatenverwaltung.Kurs;
import einlesenUndDatenverwaltung.KursListe;

/**
 * Diese Containerklasse PruefungsPlan enthält das Ergebnis des
 * Planungsalgorithmus aus PruefungsPlanung in Form von PruefungsTag-Objekten.
 * Wird durch die Klasse OutputErzeuger weiterverarbeitet
 * 
 * @author (Max Bogner / Hendrik Hertel)
 * @version (13.12.2013)
 */
public class PruefungsterminPlan {
	// private int x;
	// Speichert die Eintraege des Pruefungsplans
	private Vector<PruefungsTag> pruefungsplan = new Vector<PruefungsTag>();

	/**
	 *  
	 * Konstruktor fuer Objekte der Klasse PruefungsterminPlan.
	 * @author: max bogner
	 */
	public PruefungsterminPlan() {
	}

	/**
	 * Methode zur Rueckgabe des Vector pruefungsplan.
	 *  @author: max bogner
	 * @return pruefungsplan (Vector)
	 */
	public Vector<PruefungsTag> getPruefungsplan() {
		return pruefungsplan;
	}

	/**
	 * Methode zum Setzen des Vectors pruefungsplan.
	 *  @author: max bogner
	 * @param pruefungsplan
	 *            der zu setzende Vector pruefungsplan
	 */
	public void setPruefungsplan(Vector pruefungsplan) {
		this.pruefungsplan = pruefungsplan;
	}


	/**
	 * Fuegt der Liste ein Element hinzu.
	 * 
	 * Gibt eine Statusmeldung zurueck.
	 *  @author: max bogner
	 * @param anwesenheit
	 *            Eintrag der der Liste hinzugefuegt werden soll
	 * @return Status ob der Eintrag erfolgreich eingetragen wurde
	 */

	public boolean addElement(PruefungsTag pruefungstag) {
		try {
			pruefungsplan.add(pruefungstag);
			return true;
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return false;
		}
	}

	/**
	 * Loescht das uebergebene Element aus der Liste.
	 * 
	 * Gibt eine Zahl als Statusmeldung zurück.
	 * @author: max bogner
	 * @param pruefungstag
	 *            Eintrag der aus der Liste entfernt werden soll
	 * @return Status ob der Eintrag erfolgreich geloescht wurde
	 */
	public boolean removeElement(PruefungsTag pruefungstag) {
		try {
			pruefungsplan.remove(pruefungstag);
			return true;
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return false;
		}
	}

	/**
	 * Methode zum Erstellen des Pruefungsterminplans aus der Platzkartenliste.
	 * 
	 * @author: max bogner
	 * 
	 * @param pkl (PLatzKartenListe) die PLatzkartenliste
	 */
	// liste muss sortiert sein nach pt
	public void createPruefungsterminPlanFromPlatzkartenListe(
			PlatzKartenListe pkl) {
		// TODO Auto-generated method stub
		Vector<PruefungsTag> pt = new Vector<PruefungsTag>();
		// alle platzkarten durchgehen
		pt =  PruefungsTag.getPruefungstage();//.clone();
		// Pruefungstage durchgehen
		System.out.println("PT Pruefungstage size: "+ pt.size());
		
		for (int pti = 0; pti < pt.size(); pti++) {
			PruefungsTag ptnew = new PruefungsTag();
			
			for (int i = 0; i < pkl.getPlatzkartenliste().size(); i++) {
				//wenn pruefungstage uebereinstimmen
				String ptVonPkl = pkl.getPlatzkartenliste().elementAt(i).getPruefungstag().getName();
				KursListe kl = new KursListe();
				kl = pkl.getPlatzkartenliste().elementAt(i).getKursliste();
				if(pt.elementAt(pti).getName() == ptVonPkl && kl.getKursliste().size()>0){
					pt.elementAt(pti).getKursListe().addKursListeToKursListe(kl);
				}

			}
			KursListe klUnique = new KursListe();
			klUnique = pt.elementAt(pti).getKursListe();
			
			// Kursliste sortieren nach kursid:
			// sortierte Platzkarten nach Studentenid
			List lUnique = (List) klUnique.getKursliste();
			Kurs.setSortierKriterium("kursid");
			
			Collections.sort(lUnique, Kurs.KursIDsAbsteigend);
			//PlatzKarte.setSortierKriterium("AnzahlKurse");
			//klUnique = (Vector<Kurs>) lUnique;
			klUnique.setKursliste((Vector<Kurs>) lUnique);// = (KursListe) lUnique;
			
			//TO DO DANIEL
			klUnique.makeUnique();
			//klUnique.MAKE LISTE UNIQUE;
			//pt.elementAt(pti).setKursListe(klUnique);
		}
		//setzt den pruefungsplan
		//pruefungsplan.removeAllElements();
		pruefungsplan = pt;

	}

	/**
	 * ToString Methode erzeugt den Ausgabestring.
	 *  @author: max bogner
	 * @return str (String) der Ausgabestring
	 */
	public String toString() {
		
		String str ="";
		for(int i =0; i<pruefungsplan.size(); i++){
			String kl = pruefungsplan.elementAt(i).getKursListe().toString();
			String ptname = pruefungsplan.elementAt(i).getName();
			str = str + "\n"+ ptname + "\n"+ kl;
		}
		return str;
	}
	
}
